﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Servicios.Business.Enumerators;
using Servicios.Business.Modulo.MotorBusqueda;

namespace UnitTest.Service.Data.Modulo.Busqueda
{
    /// <summary>
    /// Test para el modulo de Busqueda
    /// </summary>
    [TestClass]
    public class BusquedaTU
    {
        /// <summary>
        /// Verifica si el modulo busqueda envia el resultado
        /// </summary>
        [TestMethod]
        public void TU_SD_002_01_ResultadoBusquedaPorTitulo()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda("pez", TipoBusqueda.Título);
            busqueda = busqueda.GetResultadoBusqueda().First();
            //Verificamos el resultado
            Assert.AreEqual("Como pez en el agua", busqueda.MaterialBibliografico.Titulo, "Titulo no es el mismo");
            Assert.AreEqual("T / 56 / 4.38", busqueda.MaterialBibliografico.Clasificacion, "Clasificacion no es el misma");
            Assert.AreEqual("Libros", busqueda.TipoMaterialBibliografico.Nombre, "Tipo no es el mismo");
            Assert.AreEqual("Vargas Llosa, Mario", busqueda.Autor.Nombres, "Nombre de autores no es el mismo");
            Assert.AreEqual(1, busqueda.Cantidad, "Cantidad no es el misma");
            Assert.AreEqual("Seix Barral", busqueda.Editorial.Nombre, "Editorial no es el misma");
        }


        /// <summary>
        /// Verifica si el modulo busqueda envia el resultado
        /// </summary>
        [TestMethod]
        public void TU_SD_002_02_ResultadoBusquedaPorAutor()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda("Vargas Llosa", TipoBusqueda.Autor);
            busqueda = busqueda.GetResultadoBusqueda();

            var resultadoEsperado = new List<string> { "La fiesta del chivo", "La casa verde", "Como pez en el agua", "Historia de un dieucidio" };
            //Verificamos el resultado
            var resultado = new List<string>();
            foreach (var item in busqueda.ToList())
            {
                resultado.Add(item.MaterialBibliografico.Titulo);
            }
            CollectionAssert.AreEquivalent(resultadoEsperado, resultado, "El resultado de la busqueda no es el mismo");
            //Comparamos la cantidades de items por cada Resultado de busqueda
            Assert.AreEqual(4, busqueda.ToList().Count, "La cantidad de items no es el mismo");
        }

        /// <summary>
        /// Verifica si el modulo busqueda envia el resultado
        /// </summary>
        [TestMethod]
        public void TU_SD_002_03_ResultadoBusquedaPorTema()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda("Novela", TipoBusqueda.Tema);
            busqueda = busqueda.GetResultadoBusqueda();

            var resultadoEsperado = new List<string> { "La fiesta del chivo", "La casa verde", "Como pez en el agua", "Historia de un dieucidio" };
            //Verificamos el resultado
            var resultado = new List<string>();
            foreach (var item in busqueda.ToList())
            {
                resultado.Add(item.MaterialBibliografico.Titulo);
            }
            CollectionAssert.AreEquivalent(resultadoEsperado, resultado, "El resultado de la busqueda no es el mismo");
            //Comparamos la cantidades de items por cada Resultado de busqueda
            Assert.AreEqual(4, busqueda.ToList().Count, "La cantidad de items no es el mismo");
        }

        /// <summary>
        /// Verifica si el modulo busqueda envia el resultado por ID del material bibliografico
        /// </summary>
        [TestMethod]
        public void TU_SD_002_04_ResultadoBusquedaByID()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda("dieucidio", TipoBusqueda.Título);
            busqueda = busqueda.GetResultadoBusqueda(5).First();
            //Verificamos el resultado
            Assert.AreEqual("Historia de un dieucidio", busqueda.MaterialBibliografico.Titulo, "Titulo no es el mismo");
            Assert.AreEqual("JL / 3464 / A.45", busqueda.MaterialBibliografico.Clasificacion, "Clasificacion no es el misma");
            Assert.AreEqual("Libros", busqueda.TipoMaterialBibliografico.Nombre, "Tipo no es el mismo");
            Assert.AreEqual("Garcia Marquez, Gabriel/Vargas Llosa, Mario", busqueda.Autor.Nombres, "Nombre de autores no es el mismo");
            Assert.AreEqual(1, busqueda.Cantidad, "Cantidad no es el misma");
            Assert.AreEqual("Pochette", busqueda.Editorial.Nombre, "Editorial no es el misma");
        }
        /// <summary>
        /// Verifica si el modulo busqueda envia el resultado
        /// </summary>
        [TestMethod]
        [ExpectedException(typeof(ArgumentException), "Resultado no previsto para el tipo de vista especificado")]
        public void TU_SD_002_05_ResultadoBusquedaExceptionPorTipoBusqueda()
        {
            //Especificamos un criterio de busqueda no especificado
            ResultadoBusqueda busqueda = new ResultadoBusqueda("Vargas Llosa", (TipoBusqueda)99);
            //Esperamos una excepcion
        }

        /// <summary>
        /// Verifica si el modulo busqueda envia el resultado
        /// </summary>
        [TestMethod]
        public void TU_SB_002_06_ObtenerAutores()
        {
            ResultadoBusqueda busqueda = new ResultadoBusqueda();
            Assert.IsTrue(busqueda.ObtenerAutores("Láz", 3).Cantidad >= 1);
            //TODO: Collation y tildes (acentos). He realizado el cambio pero no resulta.

        }

        /// <summary>
        /// Replicacion en la cantidad de los autores cuando el resultado de la busqueda es mas que 1
        /// Como replicar el bug?
        /// _ Logearse al sistema
        /// _ Introducir en el textbox de busqueda "a"
        /// _ El sistema muestra todos los libros que coinciden con este criterio
        /// _ Los nombres son concatenados, anadiendo siempre un autor del item de
        /// resultado de busqueda anterior
        /// </summary>
        [TestMethod]
        public void TU_SD_002_07_FixBug12()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda("a", TipoBusqueda.Título);
            busqueda = busqueda.GetResultadoBusqueda();
            foreach (var resultadoBusqueda in busqueda)
            {
                Assert.IsFalse(resultadoBusqueda.Autor.Nombres.Contains("Vargas Llosa, Mario/Vargas Llosa"));

            }
        }
        /// <summary>
        /// Verifica la existencia de material por el id del material bibliografico
        /// </summary>
        [TestMethod]
        public void TU_SD_002_08_ResultadoBusquedaExistencia()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda();
            busqueda = busqueda.GetExistencia(2);
            //Verificamos el resultado
            //ID/Clasificacion/CodigoBarras
            //2	NI22	CD22
            //2	NI21	CD21

            Assert.AreEqual(2, busqueda[0].MaterialBibliografico.ID, "ID no es el mismo");

            Assert.AreEqual(3, busqueda[0].Existencia.ID, "ID existencia no es el mismo");
            Assert.AreEqual("NroIng3", busqueda[0].Existencia.NumeroIngreso, "Nro. Ingreso no es el mismo");
            Assert.AreEqual("Cod03", busqueda[0].Existencia.CodigoBarras, "Codigo de barras no es el mismo");
            Assert.AreEqual("Seix Barral", busqueda[0].Editorial.Nombre, "Editorial no es el mismo");
            Assert.AreEqual("Pregrado", busqueda[0].TipoPrestamo.Nombre, "Tipo de Prestamo no es el mismo");


            Assert.AreEqual(4, busqueda[1].Existencia.ID, "ID existencia no es el mismo");
            Assert.AreEqual("NroIng4", busqueda[1].Existencia.NumeroIngreso, "Nro. Ingreso no es el mismo");
            Assert.AreEqual("Cod04", busqueda[1].Existencia.CodigoBarras, "Codigo de barras no es el mismo");
            Assert.AreEqual("Seix Barral", busqueda[1].Editorial.Nombre, "Editorial no es el mismo");
            Assert.AreEqual("Pregrado", busqueda[1].TipoPrestamo.Nombre, "Tipo de Prestamo no es el mismo");
        }

        /// <summary>
        /// Verifica la existencia de material por el id de la existencia
        /// </summary>
        [TestMethod]
        public void TU_SD_002_09_ResultadoBusquedaExistenciaByID()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda();
            busqueda = busqueda.GetExistencia(2, 3);
            //Verificamos el resultado
            //ID/Clasificacion/CodigoBarras
            //2	NI22	CD22
            //2	NI21	CD21

            Assert.AreEqual(2, busqueda.MaterialBibliografico.ID, "ID no es el mismo");

            Assert.AreEqual(3, busqueda.Existencia.ID, "ID existencia no es el mismo");
            Assert.AreEqual("NroIng3", busqueda.Existencia.NumeroIngreso, "Nro. Ingreso no es el mismo");
            Assert.AreEqual("Cod03", busqueda.Existencia.CodigoBarras, "Codigo de barras no es el mismo");
            Assert.AreEqual("Seix Barral", busqueda.Editorial.Nombre, "Editorial no es el mismo");
            Assert.AreEqual("Pregrado", busqueda.TipoPrestamo.Nombre, "Tipo de Prestamo no es el mismo");

        }

        /// <summary>
        /// Verifica la existencia de material por el id de la existencia
        /// </summary>
        [TestMethod]
        public void TU_SD_002_10_ResultadoBusquedaAunSiNoTienenExistencia()
        {
            //Especificamos los criterios de busqueda
            var busqueda = new ResultadoBusqueda("Less than zero", TipoBusqueda.Título);
            busqueda = busqueda.GetResultadoBusqueda();
            Assert.AreEqual(8, busqueda.MaterialBibliografico.ID, "ID no es el mismo");
            Assert.AreEqual(null, busqueda.Existencia.ID, "ID existencia no es el mismo");
            Assert.AreEqual(null, busqueda.Existencia.NumeroIngreso, "Nro. Ingreso no es el mismo");
            Assert.AreEqual(null, busqueda.Existencia.CodigoBarras, "Codigo de barras no es el mismo");
            Assert.AreEqual("Seix Barral", busqueda.Editorial.Nombre, "Editorial no es el mismo");
            Assert.AreEqual("Pregrado", busqueda.TipoPrestamo.Nombre, "Tipo de Prestamo no es el mismo");

        }
    }
}
